
package com.griaule.fingerprintsdk.appletsample;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URL;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

import com.griaule.grfingerjava.GrFingerJava;
import com.griaule.grfingerjava.GrFingerJavaException;



/**
 * Classe utilizada para copiar todos os arquivos utilizados pela SDK para a JVM
 */
public class AppletInstaller {

    /** Microsoft Windows. */
    private static final int WINDOWS_OS = 0;
    /** Linux */
    private static final int LINUX_OS = 1;
    /** Sistema operacional desconhecido. */
    private static final int UNKNOWN_OS = 2;

    /**Flag que diz se os arquivos foram instalados com sucesso.*/
    private static boolean installed = false;

    /**
     * Copia todas as bibliotecas nativas do SDK vindas da URL e as copia para
     * uma pasta local para uso da JVM
     */
    public synchronized static void install(URL ZipFile)
    throws IOException, UnsupportedOperationException, GrFingerJavaException {

        //Pular re-instalacao.
        if (installed)
            return;

        //Cria uma pasta temporaria para armazenamento da licenca e bibliotecas
        File destDir = File.createTempFile("FingerprintSDKApplet", "tmp");
        destDir.delete();
        destDir.mkdirs();
        destDir.deleteOnExit();

        //Extrai o conteudo do arquivo zipado
        ZipInputStream zipStream=new ZipInputStream(ZipFile.openStream());
        ZipEntry zipEntry;
        while ((zipEntry=zipStream.getNextEntry())!=null) {
            File f = new File(destDir, zipEntry.getName());
            if (zipEntry.isDirectory()) {
                f.mkdirs();
            } else {
                OutputStream out = new FileOutputStream(f);

                byte[] buffer = new byte[4096];
                while (true) {
                    int bytesRead = zipStream.read(buffer);
                    if (bytesRead == -1)
                        break;
                    out.write(buffer,0,bytesRead);
                }
                out.close();
            }
        }



        GrFingerJava.setNativeLibrariesDirectory(destDir);
        GrFingerJava.setLicenseDirectory(destDir);
        installed = true;
    }

    /**
     * Descobre em qual sistema operacional a JVM esta rodando.
     */
    private static int getOS() {
        
        String osName = System.getProperty("os.name");
        String arch = System.getProperty("os.arch");

        
        if (  (arch.equals("x86")) || (arch.equals("i386")) ||
              (arch.equals("i486")) || (arch.equals("i586")) ||
              (arch.equals("i686"))) {

            
            if (osName.startsWith("Windows"))
                return WINDOWS_OS;
            if (osName.startsWith("Linux"))
                return LINUX_OS;
        }

        
        return UNKNOWN_OS;
    }

}